/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MODELO;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author O2
 */
public class DAOEntidadCliente extends ManejadorBaseDatos implements IDAOPersistencia{

    public DAOEntidadCliente() throws Exception {
        super();
    }

    public DAOEntidadCliente(String driver, String servidor, String url, String usuarioBD, String passwordUsuarioBD, String nombreBD) throws Exception {
        super(driver, servidor, url, usuarioBD, passwordUsuarioBD, nombreBD);
    }

    public String verificarCliente(String dni){
        String rpta="";
        
        Connection conn = getConexion();
        try {
            CallableStatement proc = conn.prepareCall(" CALL verificarCliente(?) ");
            proc.setString("dni1", dni);
            ResultSet res = proc.executeQuery();
            while (res.next()) {
                rpta=res.getString("Nombres");
            }
            res.close();
        } catch (SQLException e) {
            System.err.println(e.getMessage());
        }
        desconectar();
        return rpta;
    }
    
    public String getObtenerIdCliente(String dni) {
        String rpta = "";

        Connection conn = getConexion();
        try {
            CallableStatement proc = conn.prepareCall(" CALL obtenerIdCliente(?) ");
            proc.setString("dni1", dni);
            ResultSet res = proc.executeQuery();
            while (res.next()) {
                rpta = res.getString("idCliente");
            }
            res.close();
        } catch (SQLException e) {
            System.err.println(e.getMessage());
        }
        desconectar();
        return rpta;
    }
    
    public int contarCliente() {
        int rpta = 0;
        Connection conn = getConexion();
        try {
            ResultSet prueba;
            // se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ?
            CallableStatement proc = conn.prepareCall(" CALL contarClientes() ");
            prueba = proc.executeQuery();
            while (prueba.next()) {
                rpta = Integer.parseInt(prueba.getString("numCliente"));
            }
        } catch (SQLException e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }
    
    public String getNombreCliente(String idClient) {
        String rpta = "";
        Connection conn = getConexion();
        try {
            ResultSet prueba;
            // se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ?
            CallableStatement proc = conn.prepareCall(" CALL nombreCliente(?) ");
            proc.setString("idclient", idClient);
            prueba = proc.executeQuery();
            while (prueba.next()) {
                rpta = prueba.getString("nombre");
            }
        } catch (SQLException e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }
    
    public DefaultTableModel getListaAllCliente() {
        DefaultTableModel tablemodel = new DefaultTableModel();
        String[] columNames = {"DNI","NOMBRES", "APELL PATERNO", "APELL MATERNO", "DIRECCION","EMAIL"};
        Object[][] data=new String[contarCliente()][6];
        try {
            conectar();
            //realizamos la consulta sql y llenamos los datos en la matriz "Object[][] data"
            CallableStatement pstm = this.getConexion().prepareCall("CALL listarAllClientes()");
            ResultSet res = pstm.executeQuery();
            int i = 0;
            while (res.next()) {
                data[i][0] = res.getString("dni");
                data[i][1] = res.getString("nombre");
                data[i][2] = res.getString("apellidoPaterno");
                data[i][3] = res.getString("apellidoMaterno");
                data[i][4] = res.getString("direccion");
                data[i][5] = res.getString("email");
                
                i++;
            }

            res.close();
            //se añade la matriz de datos en el DefaultTableModel
            tablemodel.setDataVector(data, columNames);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        desconectar();
        return tablemodel;
    }
    
    public DefaultTableModel getDatosCliente(int dni) {
        DefaultTableModel tablemodel = new DefaultTableModel();
        String[] columNames = {"DNI","NOMBRES", "APELL PATERNO", "APELL MATERNO", "DIRECCION","EMAIL"};
        Object[][] data=new String[contarCliente()][6];
        try {
            conectar();
            //realizamos la consulta sql y llenamos los datos en la matriz "Object[][] data"
            CallableStatement pstm = this.getConexion().prepareCall("CALL listarDatosCliente(?)");
            pstm.setString("numDNI", ""+dni);
            ResultSet res = pstm.executeQuery();
            int i = 0;
            while (res.next()) {
                data[i][0] = res.getString("dni");
                data[i][1] = res.getString("nombre");
                data[i][2] = res.getString("apellidoPaterno");
                data[i][3] = res.getString("apellidoMaterno");
                data[i][4] = res.getString("direccion");
                data[i][5] = res.getString("email");
                
                i++;
            }

            res.close();
            //se añade la matriz de datos en el DefaultTableModel
            tablemodel.setDataVector(data, columNames);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        desconectar();
        return tablemodel;
    }

    @Override
    public int insertar(IEntidad objeto) throws Exception {
        int rpta = 0;
        EntidadCliente miEntidadCliente = (EntidadCliente) objeto;
        Connection conn = getConexion();
        try {
            // se crea instancia a procedimiento, los parametros de entrada y salida se simbolizan con el signo ?
            CallableStatement proc = conn.prepareCall(" CALL insertarCliente(?,?,?,?,?,?,?)");
            //se cargan los parametros de entrada
            proc.setString("dni1", miEntidadCliente.getDni());//Tipo int
            proc.setString("nombre", miEntidadCliente.getNombre());//Tipo int
            proc.setString("apellPaterno", miEntidadCliente.getApellidoPaterno());//Tipo String
            proc.setString("apellMaterno", miEntidadCliente.getApellidoMaterno());//Tipo int
            proc.setString("direcc", miEntidadCliente.getDireccion());//Tipo String
            proc.setString("email", miEntidadCliente.getEmail());//Tipo String
            proc.setString("sexo", miEntidadCliente.getSexo());//Tipo String
            
            try {
                proc.execute();
                rpta = 1;
            } catch (Exception ex) {
                rpta = 0;
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        desconectar();
        return rpta;
    }

    @Override
    public int borrar(String condicion) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int modificar(IEntidad objeto) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}
